削除済みのAPI Gatewayのロググループをスクリプトで一括削除してみた
最近よくAmazon API Gatewayで遊んでいたのですが、あまり考えずにAPIを作成したり削除したりしていたら削除済みのAPIのロググループがたくさん残ってしまい、なんとなく邪魔だったので一括削除した際のスクリプトを紹介します。
注意
本スクリプトは、現時点でのAPI Gatewayのロググループの命名規則に依存しています。 この命名規則ですが、仕様として記述されているドキュメントを見つけられませんでした。
もしこの命名規則が変わってしまうとスクリプトの動作が変わってしまい、最悪未削除のAPIのロググループがまとめて削除されてしまう可能性があります。 そのため、本スクリプトを定期的に起動するバッチに組み込んだり、本番環境など万が一消えてしまうと問題のある環境での利用は推奨しません。
前提条件
必要なアプリケーション
jq
スクリプト内でjqを使用しているため、前提としてjqをインストールしている必要があります。
AWS CLI
リソースの取得やロググループの削除などAWSとの接続にCLIを使用するのでインストールしている必要があります。
動作確認環境
以下の環境で動作確認しています。
- macOS : Sierra(バージョン10.12.6)
- bash : GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
- AWS CLI : aws-cli/1.11.139 Python/2.7.10 Darwin/16.7.0 botocore/1.6.6
- jq : jq-1.5
スクリプト
#!/bin/bash API_GATEWAY_LOG_NAMES=apigatewayslogs.txt API_GATEWAY_LOG_NAMES_TMP=apigatewayslogs.tmp API_NAMES=existapis.txt aws apigateway get-rest-apis | jq -r '.items[].id' > ${API_NAMES} aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName' > ${API_GATEWAY_LOG_NAMES} echo "*** EXISTING API LIST ***" cat ${API_NAMES} echo "*** EXISTING API GATEWAY LOG GROUP LIST ***" cat ${API_GATEWAY_LOG_NAMES} while read line do grep -v ${line} ${API_GATEWAY_LOG_NAMES} > ${API_GATEWAY_LOG_NAMES_TMP} cat ${API_GATEWAY_LOG_NAMES_TMP} > ${API_GATEWAY_LOG_NAMES} done < ${API_NAMES} echo done echo "*** DELETE TARGET LIST ***" cat ${API_GATEWAY_LOG_NAMES} echo "delete log groups (y/n)?" read ANS if [ $ANS != 'y' ]; then exit 1 fi while read line do aws logs delete-log-group --log-group-name ${line} done < ${API_GATEWAY_LOG_NAMES} rm ${API_GATEWAY_LOG_NAMES} rm ${API_GATEWAY_LOG_NAMES_TMP} rm ${API_NAMES}
やってみた
現時点で存在するAPI一覧
一応現時点で存在するAPI一覧を確認します。(長いのでidだけ)
$ aws apigateway get-rest-apis | jq -r '.items[].id' kigsf8z3li l614daswx2 xosw40j749
API Gatewayのロググループ一覧
API Gatewayのロググループ一覧も見てみます。APIとして存在しないロググループがたくさんあります。
$ aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName' API-Gateway-Execution-Logs_5cc3pvhz5a/prod API-Gateway-Execution-Logs_b8dgm11uqc/test API-Gateway-Execution-Logs_ef9k5msy6l/test API-Gateway-Execution-Logs_gwuqlzoiv3/Prod API-Gateway-Execution-Logs_gwuqlzoiv3/Stage API-Gateway-Execution-Logs_ir1mwyypck/prod API-Gateway-Execution-Logs_kigsf8z3li/Prod API-Gateway-Execution-Logs_kigsf8z3li/Stage API-Gateway-Execution-Logs_l614daswx2/prod API-Gateway-Execution-Logs_mqco8iy8h7/test API-Gateway-Execution-Logs_qn5hr16rh6/prod API-Gateway-Execution-Logs_s1f62h7cog/prod API-Gateway-Execution-Logs_xosw40j749/prod API-Gateway-Execution-Logs_xsrdsjbp13/prod
API Gatewayのロググループ名は、API-Gateway-Execution-Logs_${APIのID}/${ステージ}
となっているようです。
スクリプトでは、aws apigateway get-rest-apis
によって取得したAPIのIDと、aws logs describe-log-groups
によって取得したロググループ名のIDを比較し、APIとして存在せず、ロググループには存在するIDのロググループを削除しています。
スクリプトを実行してロググループを削除してみる
$ sh rm_not_exist_api_gateway_logs.sh *** EXISTING API LIST *** kigsf8z3li l614daswx2 xosw40j749 *** EXISTING API GATEWAY LOG GROUP LIST *** API-Gateway-Execution-Logs_5cc3pvhz5a/prod API-Gateway-Execution-Logs_b8dgm11uqc/test API-Gateway-Execution-Logs_ef9k5msy6l/test API-Gateway-Execution-Logs_gwuqlzoiv3/Prod API-Gateway-Execution-Logs_gwuqlzoiv3/Stage API-Gateway-Execution-Logs_ir1mwyypck/prod API-Gateway-Execution-Logs_kigsf8z3li/Prod API-Gateway-Execution-Logs_kigsf8z3li/Stage API-Gateway-Execution-Logs_l614daswx2/prod API-Gateway-Execution-Logs_mqco8iy8h7/test API-Gateway-Execution-Logs_qn5hr16rh6/prod API-Gateway-Execution-Logs_s1f62h7cog/prod API-Gateway-Execution-Logs_xosw40j749/prod API-Gateway-Execution-Logs_xsrdsjbp13/prod done *** DELETE TARGET LIST *** API-Gateway-Execution-Logs_5cc3pvhz5a/prod API-Gateway-Execution-Logs_b8dgm11uqc/test API-Gateway-Execution-Logs_ef9k5msy6l/test API-Gateway-Execution-Logs_gwuqlzoiv3/Prod API-Gateway-Execution-Logs_gwuqlzoiv3/Stage API-Gateway-Execution-Logs_ir1mwyypck/prod API-Gateway-Execution-Logs_mqco8iy8h7/test API-Gateway-Execution-Logs_qn5hr16rh6/prod API-Gateway-Execution-Logs_s1f62h7cog/prod API-Gateway-Execution-Logs_xsrdsjbp13/prod delete log groups (y/n)? y
削除後のロググループを確認
$ aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName' API-Gateway-Execution-Logs_kigsf8z3li/Prod API-Gateway-Execution-Logs_kigsf8z3li/Stage API-Gateway-Execution-Logs_l614daswx2/prod API-Gateway-Execution-Logs_xosw40j749/prod
実行時に存在していた(削除していない)APIのロググループ以外が削除できました。
終わりに
基本的に不要なリソースは都度削除するのが良いと思いますが、溜まってしまったものはCLIを使って一括で削除すると楽です。
繰り返しとなりますが、本スクリプトを定期的に起動するバッチに組み込んだり本番環境など万が一消えてしまうと問題のある環境での利用は推奨しません。
私からは以上です。